<?php
/**
 +------------------------------------------------------------------------------
 * 公共方法
 +------------------------------------------------------------------------------
 * @author    木頭
 * @version   1.2
 * @filename functions.php
 * @date 2009/12/17
 * @last modified 2010.4.12
 +------------------------------------------------------------------------------
 */
if(! defined('APP_PATH')) exit;

/* 运行时间和占用内存,数据库查询次数 */
function run_info()
{
	global $run_start_time,$run_start_memory,$run_dbquery_count;
	
	if( C('show_runinfo') )
	
	echo '运行耗时：' . (microtime(1) - $run_start_time)*1000 . 'ms' . ' 使用内存：'
	. number_format((memory_get_usage() - $run_start_memory)/1024) .'K 数据库查询：'
	.$run_dbquery_count .'次';
}


/* dump输出后，停止 */
function dumpdie($thing)
{dump($thing);exit;}

/* print输出后，停止 */
function printdie($thing)
{dump($thing,null,0);exit;}

/**
 * 1.浏览器友好的变量输出，var支持任何变量，echo表示是否需要输出，如果为否，则返回要显示的字符串。
 * 2.Strict表示是否输出详细信息，如果为否，使用print_r输出，如果为是，使用var_dump输出。
 * 3.Dump函数还支持xdebug扩展
 * @param string $var
 * @param boolean $echo
 * @param string $label
 * @param boolean $strict
 * @return void
 */
function dump($var, $label=null, $strict=true, $echo=true )
{
    $label = empty($label) ? '' : '<span style="color: red;font: bold;">'. rtrim($label) . ":</span>\n";
    if(!$strict)
    {
		$output = print_r($var, true);
		$output = "<pre>".$label.htmlspecialchars($output,ENT_QUOTES)."</pre>";
    }
    else
    {
        ob_start();
        var_dump($var);
        $output = ob_get_clean();
        if(!extension_loaded('xdebug'))
        {
            $output = preg_replace('/\]\=\>\n(\s+)/m', "] => ", $output);
            $output = '<pre>'. $label . htmlspecialchars($output, ENT_QUOTES). '</pre>';
        }
        else
        	$output = $label.$output;
    }
    
    if ($echo)
    {
        echo $output;
        return ;
    }
    else
        return $output;
}


/**
 * 读取config配置文件的value
 * @param string $name 获取配置名称, 缺省返回所有配置
 * @param string $config_name 从哪个配置文件中从获取，默认main
 * @package framework
 */
function C($name='',$config_name='main')
{
	#原理：先加载惯例配置，然后加载用户自定义配制，如果debug模式，再用dev.config.php覆盖
	$filename = APP_PATH .'/conf/'. $config_name .'.config.php';
			
	if($config_name == 'main')
	{
		$config = include FW_PATH.'/conf/convention.php';
		
		#可能main.config.php不存在，这里设置可以允许main.config.php不存在
		if( file_exists($filename) ) $config = array_merge( $config, include($filename) );
		
		#覆盖dev配置文件,强制为开发环境
		if( $config['debug'] )
			$config =  array_merge( $config, include(FW_PATH.'/conf/dev.config.php') );
	}
	else
	{
		if( file_exists($filename) )
			$config = include $filename;
		else
			throw new ephpException("错误：配置文件：$filename 不存在！",1055);
	}

	if(empty($name)) return $config;
	else
	{
		if(! empty($config[$name]) )
			return $config[$name];
		else
			return 0;
	}
}

/**
 * 快速创建model模型，相当于 new testModel()
 * @param string $model_name 模型名
 * @param string $db_config_name 要连接的数据库配制名，默认为空
 * @return object 模型对象
 */
function M($model_name, $db_config_name='')
{
	$model_name = $model_name . 'Model';
	$obj = new $model_name();
	
	if(! empty($db_config_name))
		$obj->dbconfig($db_config_name);
	return $obj;
}

/**
 * 不需要创建model文件，快速实例化模型对象
 * @param string $model_name 模型名
 * @param string $db_config 要连接的数据库配制，默认default
 * @return object
 */
function QM($model_name, $db_config_name='default')
{
	$obj = new model;
	$obj->dbconfig($db_config_name);
	$obj->table($model_name);
	return $obj;
}


/**
 +----------------------------------------------------------
 * write日志
 +----------------------------------------------------------
 * @param string $name log名称，如果带/则是文件夹
 * @param string $value log内容
 +----------------------------------------------------------
 * @return null
 +----------------------------------------------------------
 */
function wlog($name, $value)
{
	error_log($value."\n", 3, APP_PATH . '/runtime/logs/' . $name);
}



/**
 +----------------------------------------------------------
 * 数据缓存
 +----------------------------------------------------------
 * @param string $name 缓存名称
 * @param string $value 缓存值
 * @param integer $expire 缓存有效期
 +----------------------------------------------------------
 * @return array
 +----------------------------------------------------------
 */
function S($name,$value='',$expire=3600)
{
	return filecache::cache($name,$value,$expire,'serialize');
}

/**
 * 文件缓存
 *
 * @param string $name 缓存名称
 * @param string $value 缓存的文件内存
 * @param integer $expire 有效期
 * @return string
 */
function F($name,$value='',$expire=3600)
{
	return filecache::cache($name,$value,$expire,'array');
}
//显示404页面
function show404()
{
	Http::sendStatus(404);
	include FW_PATH.'/common/404.html';
	exit;
}
//-----------------------------------------------------不常用函数
// xml编码
function xml_encode($data,$encoding='utf-8',$root="root")
{
	include FW_PATH.'/exts/xml.class.php';
	$xml = new xml();
	return $xml->xml_encode($data,$encoding,$root);
}

#GBK To UTF-8
//function g2u($str)
//{
//	return iconv('gbk', 'utf-8',  $str);
//}
//#UTF-8 To GBK
//function u2g($str)
//{
//	return iconv('utf-8', 'gbk', $str);
//}

#模拟 C++ cin函数
//function cin()
//{
//	$fp = fopen('php://stdin', 'r');
//	$input = fgets($fp, 255);
//	fclose($fp);
//	$input = chop($input); // 去除尾部空白
//	return $input;
//}